home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / open.c < prev    next >
C/C++ Source or Header  |  1988-11-03  |  2KB  |  101 lines

  1. /* 
  2.  * open.c --
  3.  *
  4.  *    Procedure to map from Unix open system call to Sprite.
  5.  *
  6.  * Copyright (C) 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef lint
  11. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/open.c,v 1.7 88/11/03 08:42:16 ouster Exp $ SPRITE (Berkeley)";
  12. #endif not lint
  13.  
  14. #include <sprite.h>
  15. #include <stdio.h>
  16. #include <fs.h>
  17. #include "compatInt.h"
  18. #include <sys/file.h>
  19. #include <errno.h>
  20. #include <status.h>
  21.  
  22.  
  23. /*
  24.  *----------------------------------------------------------------------
  25.  *
  26.  * open --
  27.  *
  28.  *    Procedure to map from Unix open system call to Sprite Fs_Open.
  29.  *    Mostly this has to map the usageFlags argument
  30.  *
  31.  * Results:
  32.  *    UNIX_ERROR is returned upon error, with the actual error code
  33.  *    stored in errno.  A file descriptor is returned upon success.
  34.  *
  35.  * Side effects:
  36.  *    Opening a file sets up state in the filesystem until the file is
  37.  *    closed.  
  38.  *
  39.  *----------------------------------------------------------------------
  40.  */
  41.  
  42.     /* VARARGS2 */
  43. int
  44. open(pathName, unixFlags, permissions)
  45.     char *pathName;        /* The name of the file to open */
  46.     register int unixFlags;    /* O_RDONLY O_WRONLY O_RDWR O_NDELAY
  47.                  * O_APPEND O_CREAT O_TRUNC O_EXCL */
  48.     int permissions;        /* Permission mask to use on creation */
  49. {
  50.     int streamId;        /* place to hold stream id allocated by
  51.                  * Fs_Open */
  52.     ReturnStatus status;    /* result returned by Fs_Open */
  53.     register int useFlags = 0;    /* Sprite version of flags */
  54.  
  55.     /*
  56.      * Convert unixFlags to FS_READ, etc.
  57.      */
  58.      
  59.     if (unixFlags & FASYNC) {
  60.     fprintf(stderr, "open - FASYNC not supported\n");
  61.     errno = EINVAL;
  62.     return(UNIX_ERROR);
  63.     }
  64.     if (unixFlags & O_RDWR) {
  65.     useFlags |= FS_READ|FS_WRITE;
  66.     } else if (unixFlags & O_WRONLY) {
  67.     useFlags |= FS_WRITE;
  68.     } else {
  69.     useFlags |= FS_READ;
  70.     }
  71.     if (unixFlags & FNDELAY) {
  72.     useFlags |= FS_NON_BLOCKING;
  73.     }
  74.     if (unixFlags & FAPPEND) {
  75.     useFlags |= FS_APPEND;
  76.     }
  77.     if (unixFlags & FTRUNC) {
  78.     useFlags |= FS_TRUNC;
  79.     }
  80.     if (unixFlags & FEXCL) {
  81.     useFlags |= FS_EXCLUSIVE;
  82.     }
  83.     if (unixFlags & O_MASTER) {
  84.     useFlags |= FS_PDEV_MASTER;
  85.     }
  86.     if (unixFlags & O_PFS_MASTER) {
  87.     useFlags |= FS_PFS_MASTER;
  88.     }
  89.     if (unixFlags & FCREAT) {
  90.     useFlags |= FS_CREATE;
  91.     }
  92.  
  93.     status = Fs_Open(pathName, useFlags, permissions, &streamId);
  94.     if (status != SUCCESS) {
  95.     errno = Compat_MapCode(status);
  96.     return(UNIX_ERROR);
  97.     } else {
  98.     return(streamId);
  99.     }
  100. }
  101.